home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Information / comp.lang.c++ / C++_FAQ;_posting_#1_4 next >
Text File  |  1994-06-01  |  44KB  |  897 lines

  1. Newsgroups: comp.lang.c++
  2. Path: bloom-beacon.mit.edu!noc.near.net!usenet.elf.com!rpi!clarkson!cheetah.ece.clarkson.edu!cline
  3. From: cline@cheetah.ece.clarkson.edu (Marshall Cline)
  4. Subject: C++ FAQ: posting #1/4
  5. Message-ID: <1994May9.131212.28989@news.clarkson.edu>
  6. Followup-To: comp.lang.c++
  7. Summary: Please read this before posting to comp.lang.c++
  8. Sender: cline@sun.soe.clarkson.edu
  9. Nntp-Posting-Host: cheetah.ece.clarkson.edu
  10. Reply-To: cline@parashift.com (Marshall Cline)
  11. Organization: Paradigm Shift, Inc (training/OOD/C++/libraries)
  12. Date: Mon, 9 May 1994 13:12:12 GMT
  13. Expires: Thu, 9 Jun 1994 13:12:12 GMT
  14. Lines: 881
  15.  
  16. comp.lang.c++ Frequently Asked Questions list (with answers, fortunately).
  17. Copyright (C) 1991-93 Marshall P. Cline, Ph.D.
  18. Posting 1 of 4.
  19.  
  20. ((((( THERE HAVE NOT BEEN ANY CHANGES SINCE LAST MONTH )))))
  21.  
  22. ==============================================================================
  23. SECTION 1: Introduction and table of contents
  24. ==============================================================================
  25.  
  26.     Document:    Frequently-Asked-Questions for comp.lang.c++
  27.     Revision:    Sep 13, 1993
  28.  
  29.     Author:        Marshall P. Cline, Ph.D.
  30.             Paradigm Shift, Inc.
  31.             One Park St. / Norwood, NY  13668
  32.             voice: 315-353-6100
  33.             fax:   315-353-6110
  34.             email: cline@parashift.com
  35.  
  36.     Copyright:    Copyright (C), 1991-93 Marshall P. Cline, Ph.D.
  37.             Permission to copy all or part of this work is granted,
  38.             provided that the copies are not made or distributed
  39.             for resale (except nominal copying fee may be charged),
  40.             and provided that the NO WARRANTY, author-contact, and
  41.             copyright notice are retained verbatim & are displayed
  42.             conspicuously.  If anyone needs other permissions that
  43.             aren't covered by the above, please contact the author.
  44.  
  45.     NO WARRANTY:    THIS WORK IS PROVIDED ON AN "AS IS" BASIS.  THE AUTHOR
  46.             PROVIDES NO WARRANTY WHATSOEVER, EITHER EXPRESS OR
  47.             IMPLIED, REGARDING THE WORK, INCLUDING WARRANTIES WITH
  48.             RESPECT TO ITS MERCHANTABILITY OR FITNESS FOR ANY
  49.             PARTICULAR PURPOSE.
  50.  
  51.     Availability:    This is available via anonymous ftp
  52.             from: sun.soe.clarkson.edu [128.153.12.3]
  53.             in the file: pub/C++/FAQ
  54.  
  55.     Without FTP:    You can also get it by sending electronic mail:
  56.             |    To: archive-server@sun.soe.clarkson.edu
  57.             |    Subject: send C++/FAQ
  58.             This will help those who don't have ftp.
  59.         (note: I hear the mail server is down; if you have problems,
  60.                send details and I'll look into it).
  61.  
  62.     See also:    comp.lang.c's FAQ appears at the beginning of every
  63.             month in that newsgroup, and is maintained by
  64.             Steve Summit (scs@adm.mit.edu).
  65.  
  66. ==============================================================================
  67. SUBSECTION 1A: Table of Contents
  68. ==============================================================================
  69.  
  70. ========== POSTING #1 ==========
  71.  
  72. SECTION 1: Introduction and table of contents
  73. SUBSECTION 1A: Table of Contents
  74. SUBSECTION 1B: Nomenclature and Common Abbreviations
  75.  
  76. SECTION 2: Environmental/managerial issues
  77. Q1: What is C++? What is OOP?
  78. Q2: What are some advantages of C++?
  79. Q3: Who uses C++?
  80. Q4: Are there any C++ standardization efforts underway?
  81. Q5: Where can I ftp a copy of the latest ANSI-C++ draft standard?
  82. Q6: Is C++ backward compatible with ANSI-C?
  83. Q7: How long does it take to learn C++?
  84.  
  85. SECTION 3: Basics of the paradigm
  86. Q8: What is a class?
  87. Q9: What is an object?
  88. Q10: What is a reference?
  89. Q11: What happens if you assign to a reference?
  90. Q12: How can you reseat a reference to make it refer to a different object?
  91. Q13: When should I use references, and when should I use pointers?
  92. Q14: What are inline fns? What are their advantages? How are they declared?
  93.  
  94. SECTION 4: Constructors and destructors
  95. Q15: What is a constructor?  Why would I ever use one?
  96. Q16: How can I make a constructor call another constructor as a primitive?
  97. Q17: What are destructors really for?  Why would I ever use them?
  98.  
  99. SECTION 5: Operator overloading
  100. Q18: What is operator overloading?
  101. Q19: What operators can/cannot be overloaded?
  102. Q20: Can I create a `**' operator for `to-the-power-of' operations?
  103.  
  104. SECTION 6: Friends
  105. Q21: What is a `friend'?
  106. Q22: Do `friends' violate encapsulation?
  107. Q23: What are some advantages/disadvantages of using friends?
  108. Q24: What does it mean that `friendship is neither inherited nor transitive'?
  109. Q25: When would I use a member function as opposed to a friend function?
  110.  
  111. SECTION 7: Input/output via <iostream.h> and <stdio.h>
  112. Q26: How can I provide printing for a `class X'?
  113. Q27: Why should I use <iostream.h> instead of the traditional <stdio.h>?
  114. Q28: Printf/scanf weren't broken; why `fix' them with ugly shift operators?
  115.  
  116. ========== POSTING #2 ==========
  117.  
  118. SECTION 8: Freestore management
  119. Q29: Does `delete ptr' delete the ptr or the pointed-to-data?
  120. Q30: Can I free() ptrs alloc'd with `new' or `delete' ptrs alloc'd w/ malloc()?
  121. Q31: Why should I use `new' instead of trustworthy old malloc()?
  122. Q32: Why doesn't C++ have a `realloc()' along with `new' and `delete'?
  123. Q33: How do I allocate / unallocate an array of things?
  124. Q34: What if I forget the `[]' when `delete'ing array allocated via `new X[n]'?
  125.  
  126. SECTION 9: Debugging and error handling
  127. Q35: How can I handle a constructor that fails?
  128. Q36: How can I compile-out my debugging print statements?
  129.  
  130. SECTION 10: Const correctness
  131. Q37: What is `const correctness'?
  132. Q38: Is `const correctness' a good goal?
  133. Q39: Is `const correctness' tedious?
  134. Q40: Should I try to get things const correct `sooner' or `later'?
  135. Q41: What is a `const member function'?
  136. Q42: What is an `inspector'?  What is a `mutator'?
  137. Q43: What is `casting away const in an inspector' and why is it legal?
  138. Q44: But doesn't `cast away const' mean lost optimization opportunities?
  139.  
  140. SECTION 11: Inheritance
  141. Q45: What is inheritance?
  142. Q46: Ok, ok, but what is inheritance?
  143. Q47: How do you express inheritance in C++?
  144. Q48: What is `incremental programming'?
  145. Q49: Should I pointer-cast from a derived class to its base class?
  146. Q50: Derived* --> Base* works ok; why doesn't Derived** --> Base** work?
  147. Q51: Does array-of-Derived is-NOT-a-kind-of array-of-Base mean arrays are bad?
  148. SUBSECTION 11A: Inheritance -- virtual functions
  149. Q52: What is a `virtual member function'?
  150. Q53: What is dynamic dispatch?  Static dispatch?
  151. Q54: Can I override a non-virtual fn?
  152. Q55: Why do I get the warning "Derived::foo(int) hides Base::foo(double)"?
  153. SUBSECTION 11B: Inheritance -- conformance
  154. Q56: Can I `revoke' or `hide' public member fns inherited from my base class?
  155. Q57: Is a `Circle' a kind-of an `Ellipse'?
  156. Q58: Are there other options to the `Circle is/isnot kind-of Ellipse' dilemma?
  157. SUBSECTION 11C: Inheritance -- access rules
  158. Q59: Why can't I access `private' things in a base class from a derived class?
  159. Q60: What's the difference between `public:', `private:', and `protected:'?
  160. Q61: How can I protect subclasses from breaking when I change internal parts?
  161. SUBSECTION 11D: Inheritance -- constructors and destructors
  162. Q62: Why does base ctor get *base*'s virtual fn instead of the derived version?
  163. Q63: Does a derived class dtor need to explicitly call the base destructor?
  164. SUBSECTION 11E: Inheritance -- private and protected inheritance
  165. Q64: How do you express `private inheritance'?
  166. Q65: How are `private derivation' and `containment' similar? dissimilar?
  167. Q66: Should I pointer-cast from a `privately' derived class to its base class?
  168. Q67: Should I pointer-cast from a `protected' derived class to its base class?
  169. Q68: What are the access rules with `private' and `protected' inheritance?
  170. Q69: Do most C++ programmers use containment or private inheritance?
  171.  
  172. SECTION 12: Abstraction
  173. Q70: What's the big deal of separating interface from implementation?
  174. Q71: How do I separate interface from implementation in C++ (like Modula-2)?
  175. Q72: What is an ABC (`abstract base class')?
  176. Q73: What is a `pure virtual' member function?
  177. Q74: How can I provide printing for an entire hierarchy rooted at `class X'?
  178. Q75: What is a `virtual destructor'?
  179. Q76: What is a `virtual constructor'?
  180.  
  181. ========== POSTING #3 ==========
  182.  
  183. SECTION 13: Style guidelines
  184. Q77: What are some good C++ coding standards?
  185. Q78: Are coding standards necessary?  sufficient?
  186. Q79: Should our organization determine coding standards from our C experience?
  187. Q80: Should I declare locals in the middle of a fn or at the top?
  188. Q81: What source-file-name convention is best? `foo.C'? `foo.cc'? `foo.cpp'?
  189. Q82: What header-file-name convention is best? `foo.H'? `foo.hh'? `foo.hpp'?
  190. Q83: Are there any lint-like guidelines for C++?
  191.  
  192. SECTION 14: C++/Smalltalk differences and keys to learning C++
  193. Q84: Why does C++'s FAQ have a section on Smalltalk? Is this Smalltalk-bashing?
  194. Q85: What's the difference between C++ and Smalltalk?
  195. Q86: What is `static typing', and how is it similar/dissimilar to Smalltalk?
  196. Q87: Which is a better fit for C++: `static typing' or `dynamic typing'?
  197. Q88: How can you tell if you have a dynamically typed C++ class library?
  198. Q89: Will `standard C++' include any dynamic typing primitives?
  199. Q90: How do you use inheritance in C++, and is that different from Smalltalk?
  200. Q91: What are the practical consequences of diffs in Smalltalk/C++ inheritance?
  201. Q92: Do you need to learn a `pure' OOPL before you learn C++?
  202. Q93: What is the NIHCL?  Where can I get it?
  203.  
  204. SECTION 15: Reference and value semantics
  205. Q94: What is value and/or reference semantics, and which is best in C++?
  206. Q95: What is `virtual data', and how-can / why-would I use it in C++?
  207. Q96: What's the difference between virtual data and dynamic data?
  208. Q97: Should class subobjects be ptrs to freestore allocated objs, or contained?
  209. Q98: What are relative costs of the 3 performance hits of allocated subobjects?
  210. Q99: What is an `inline virtual member fn'?  Are they ever actually `inlined'?
  211. Q100: Sounds like I should never use reference semantics, right?
  212. Q101: Does the poor performance of ref semantics mean I should pass-by-value?
  213.  
  214. ========== POSTING #4 ==========
  215.  
  216. SECTION 16: Linkage-to/relationship-with C
  217. Q102: How can I call a C function `f()' from C++ code?
  218. Q103: How can I create a C++ function `f()' that is callable by my C code?
  219. Q104: Why's the linker giving errors for C/C++ fns being called from C++/C fns?
  220. Q105: How can I pass an object of a C++ class to/from a C function?
  221. Q106: Can my C function access data in an object of a C++ class?
  222. Q107: Why do I feel like I'm `further from the machine' in C++ as opposed to C?
  223.  
  224. SECTION 17: Pointers to member functions
  225. Q108: What is the type of `ptr-to-member-fn'?  Is it diffn't from `ptr-to-fn'?
  226. Q109: How can I ensure `X's objects are only created with new, not on the stack?
  227. Q110: How do I pass a ptr to member fn to a signal handler,X event callback,etc?
  228. Q111: Why am I having trouble taking the address of a C++ function?
  229. Q112: How do I declare an array of pointers to member functions?
  230.  
  231. SECTION 18: Container classes and templates
  232. Q113: How can I insert/access/change elements from a linked list/hashtable/etc?
  233. Q114: What's the idea behind `templates'?
  234. Q115: What's the syntax / semantics for a `function template'?
  235. Q116: What's the syntax / semantics for a `class template'?
  236. Q117: What is a `parameterized type'?
  237. Q118: What is `genericity'?
  238. Q119: How can I fake templates if I don't have a compiler that supports them?
  239.  
  240. SECTION 19: Nuances of particular implementations
  241. Q120: Why don't variable arg lists work for C++ on a Sun SPARCstation?
  242. Q121: GNU C++ (g++) produces big executables for tiny programs; Why?
  243. Q122: Is there a yacc-able C++ grammar?
  244. Q123: What is C++ 1.2?  2.0?  2.1?  3.0?
  245. Q124: How does the lang accepted by cfront 3.0 differ from that accepted by 2.1?
  246. Q125: Why are exceptions going to be implemented after templates? Why not both?
  247. Q126: What was C++ 1.xx, and how is it different from the current C++ language?
  248.  
  249. SECTION 20: Miscellaneous technical and environmental issues
  250. SUBSECTION 20A: Miscellaneous technical issues:
  251. Q127: Why are classes with static data members getting linker errors?
  252. Q128: What's the difference between the keywords struct and class?
  253. Q129: Why can't I overload a function by its return type?
  254. Q130: What is `persistence'?  What is a `persistent object'?
  255. SUBSECTION 20B: Miscellaneous environmental issues:
  256. Q131: Is there a TeX or LaTeX macro that fixes the spacing on `C++'?
  257. Q132: Where can I access C++2LaTeX, a LaTeX pretty printer for C++ source?
  258. Q133: Where can I access `tgrind', a pretty printer for C++/C/etc source?
  259. Q134: Is there a C++-mode for GNU emacs?  If so, where can I get it?
  260. Q135: What is `InterViews'?
  261. Q136: Where can I get OS-specific questions answered (ex:BC++,DOS,Windows,etc)?
  262. Q137: Why does my DOS C++ program says `Sorry: floating point code not linked'?
  263.  
  264. ==============================================================================
  265. SUBSECTION 1B: Nomenclature and Common Abbreviations
  266. ==============================================================================
  267.  
  268. Here are a few of the abbreviations/etc used in this article:
  269.  
  270.     term    meaning
  271.     ====    ===========
  272.     ctor    constructor
  273.     copy-ctor    copy constructor (also `X(const X&)', pronounced `X-X-ref')
  274.     dtor    destructor
  275.     fn        function
  276.     fns        functions
  277.     ptr        pointer, a C/C++ construct declared by:  int * p;
  278.     ref        reference, a C++ construct declared by:  int & r;
  279.     OO        object-oriented
  280.     OOP        object-oriented programming
  281.     OOPL    object-oriented programming language
  282.     method    an alternate term for `member function'
  283.  
  284. ==============================================================================
  285. SECTION 2: Environmental/managerial issues
  286. ==============================================================================
  287.  
  288. Q1: What is C++? What is OOP?
  289.  
  290. C++ can be used simply as `a better C', but that is not its real advantage.
  291. C++ is an object-oriented programming language (OOPL).  OOPLs appear to be the
  292. current `top shelf' in the development of programming languages that can manage
  293. the complexity of large software systems.
  294.  
  295. Some OOP hype: software engineering is `failing' to provide the current users
  296. demands for large, complex software systems.  But this `failure' is actually
  297. due to SE's *successes*.  In other words, structured programming was developed
  298. to allow software engineers to design/build HUGE software systems (that's a
  299. success).  When users saw how successful these systems were, they said, `More
  300. --- give me MOOORRRREEEE'.  They wanted more power, more features, more
  301. flexibility.  100K line systems are almost commonplace nowadays, and they still
  302. want more.  Structured programming techniques, some say, begin to break down
  303. around 100K lines (the complexity gives the design team too many headaches, and
  304. fixing one problem breaks 5 more, etc).  So pragmatics demands a better
  305. paradigm than structured programming.  Hence OO-design.
  306.  
  307. ==============================================================================
  308.  
  309. Q2: What are some advantages of C++?
  310.  
  311. GROWTH OF C++: C++ is by far the most popular OOPL.  Knowing C++ is a good
  312. resume-stuffer.  But don't just use it as a better C, or you won't be using all
  313. its power.  Like any quality tool, C++ must be used the way it was designed to
  314. be used.  The number of C++ users is doubling every 7.5 to 9 months.  This
  315. exponential growth can't continue forever(!), but it is becoming a significant
  316. chunk of the programming market (it's already the dominant OOPL).
  317.  
  318. ENCAPSULATION: For those of you who aren't on a team constructing software
  319. mega-systems, what does C++ buy you?  Here's a trivial example.  Suppose you
  320. want a `Foible' data type.  One style of doing this in `C' is to create a
  321. `Foible.h' file that holds the `public interface', then stick all the
  322. implementation into a `Foible.c' file.  Encapsulation (hiding the details) can
  323. be achieved by making all data elements in `Foible.c' be `static'.  But that
  324. means you only get one `Foible' in the entire system, which is ok if `Foible'
  325. is a Screen or perhaps a HardDisk, but is lousy if Foible is a complex number
  326. or a line on the screen, etc.  Read on to see how it's done in `C' vs `C++'.
  327.  
  328. MULTIPLE INSTANCES: The `C' solution to the above `multiple instances' problem
  329. is to wrap all the data members in a struct (like a Pascal `record'), then pass
  330. these structs around as if they were the `ComplexNumber' or whatever.  But this
  331. loses encapsulation.  Other techniques can be devised which allow both multiple
  332. instances and encapsulation, however these lose on other accounts (ex:
  333. typedef'ing `Foible' to be `void*' loses type safety, and wrapping a `void*' in
  334. the Foible struct loses an extra layer of indirection).  So the `module'
  335. technique loses multiple instantiations, but the `struct' technique loses
  336. encapsulation.  C++ allows you to combine the best of both worlds - you can
  337. have what amount to structs whose data is hidden.
  338.  
  339. INLINE FUNCTION CALLS: The `encapsulated C' solution above requires a function
  340. call to access even trivial fields of the data type (if you allowed direct
  341. access to the struct's fields, the underlying data structure would become
  342. virtually impossible to change since too many pieces of code would *rely* on it
  343. being the `old' way).  Function call overhead is small, but can add up.  C++
  344. provides a solution by allowing function calls to be expanded `inline', so you
  345. have: the (1) safety of encapsulation, (2) convenience of multiple instances,
  346. (3) speed of direct access.  Furthermore the parameter types of these inline
  347. functions are checked by the compiler, an improvement over C's #define macros.
  348.  
  349. OVERLOADING OPERATORS: For the `ComplexNumber' example, you want to be able to
  350. use it in an expression `just as if' it was a builtin type like int or float.
  351. C++ allows you to overload operators, so you can tell the compiler what it
  352. means for two complex numbers to be added, subtracted, multiplied, etc.  This
  353. gives you: z0 = (z1 + z2) * z3 / z4; Furthermore you might want string1+string2
  354. to mean string concatenation, etc.  One of the goals of C++ is to make user
  355. defined types `look like' builtin types.  You can even have `smart pointers',
  356. which means a pointer `p' could actually be a user defined data type that
  357. `points' to a disk record (for example).  `Dereferencing' such a pointer (ex:
  358. i=*p;) means ``seek to the location on disk where p `points' and return its
  359. value''.  Also statements like p->field=27; can store things on disk, etc.  If
  360. later on you find you can fit the entire pointed-to data structure in memory,
  361. you just change the user-defined pseudo-pointer type and recompile.  All the
  362. code that used these `pseudo pointers' doesn't need to be changed at all.
  363.  
  364. INHERITANCE: We still have just scratched the surface.  In fact, we haven't
  365. even gotten to the `object-oriented' part yet!  Suppose you have a Stack data
  366. type with operations push, pop, etc.  Suppose you want an InvertableStack,
  367. which is `just like' Stack except it also has an `invert' operation.  In `C'
  368. style, you'd have to either (1) modify the existing Stack module (trouble if
  369. `Stack' is being used by others), or (2) copy Stack into another file and text
  370. edit that file (results in lots of code duplication, another chance to break
  371. something tricky in the Stack part of InvertableStack, and especially twice as
  372. much code to maintain).  C++ provides a much cleaner solution: inheritance.
  373. You say `InvertableStack inherits everything from Stack, and InvertableStack
  374. adds the invert operation'.  Done.  Stack itself remains `closed' (untouched,
  375. unmodified), and InvertableStack doesn't duplicate the code for push/pop/etc.
  376.  
  377. POLYMORPHISM: The real power of OOP isn't just inheritance, but is the ability
  378. to pass an InvertableStack around as if it actually were a Stack.  This is
  379. `safe' since (in C++ at least) the is-a relation follows public inheritance
  380. (ie: a InvertableStack is-a Stack that can also invert itself).  Polymorphism
  381. is easiest to understand from an example, so here's a `classic': a graphical
  382. draw package might deal with Circles, Squares, Rectangles, general Polygons,
  383. and Lines.  All of these are Shapes.  Most of the draw package's functions need
  384. a `Shape' parameter (as opposed to some particular kind of shape like Square).
  385. Ex: if a Shape is picked by a mouse, the Shape might get dragged across the
  386. screen and placed into a new location.  Polymorphism allows the code to work
  387. correctly even if the compiler only knows that the parameter is a `Shape'
  388. without knowing the exact kind of Shape it is.  Furthermore suppose the
  389. `pick_and_drag(Shape*) function just mentioned was compiled on Tuesday, and on
  390. Wednesday you decide to add the Hexagon shape.  Strange as it sounds,
  391. pick_and_drag() will still work with Hexagons, even though the Hexagon didn't
  392. even exist when pick_and_drag() was compiled!!  (it's not really `amazing' once
  393. you understand how the C++ compiler does it -- but it's still very convenient!)
  394.  
  395. ==============================================================================
  396.  
  397. Q3: Who uses C++?
  398. A: Lots and lots of companies and government sites.  Lots.
  399. Statistically, 20 to 30 people will consider themselves to be new C++
  400. programmers before you finish reading the responses to these FAQs.
  401.  
  402. ==============================================================================
  403.  
  404. Q4: Are there any C++ standardization efforts underway?
  405. A: Yes; ANSI (American) and ISO (International) groups are working closely with
  406. each other.
  407.  
  408. `X3J16' is the name of the ANSI-C++ committee.
  409.  
  410. `WG21' is the name of ISO's C++ standards group.
  411.  
  412. The committees are using the `ARM' as a base document:
  413.     `Annotated C++ Reference Manual', Ellis and Stroustrup, Addison/Wesley.
  414.     ISBN 0-201-51459-1
  415.  
  416. The major players in the ANSI/ISO C++ standards process includes just about
  417. everyone:
  418.  
  419. AT&T, IBM, DEC, HP, Sun, MS, Borland, Zortech, Apple, OSF, <add your favorite
  420. here>, ... and a lot of users and smaller companies.  About 70 people attend
  421. each ANSI C++ meeting.  People come from USA, UK, Japan, Germany, Sweden,
  422. Denmark, France, ... (all have `local' committees sending official
  423. representatives and conducting `local' meetings).
  424.  
  425. Optimistically the standard might be finished by 1995-6 time frame (this is
  426. fast for a proper standards process).
  427.  
  428. ==============================================================================
  429.  
  430. Q5: Where can I ftp a copy of the latest ANSI-C++ draft standard?
  431. A: You can't.  ANSI standards and/or drafts are NOT available in machine
  432. readable form.
  433.  
  434. >>>>UPDATED 9/93
  435. You can get a paper copy by sending a request to:
  436.     Standards Secretariat
  437.     CBEMA/X3
  438.     1250 I Street NW
  439.     Suite 200
  440.     Washington, DC  20005
  441.  
  442. Ask for the latest version of `Working Paper for Draft Proposed American
  443. National Standard for Information Systems -- Programming Language C++'.
  444. The last known phone number: 202-626-5738.  The last known price is $25.
  445.  
  446. ==============================================================================
  447.  
  448. Q6: Is C++ backward compatible with ANSI-C?
  449. A: Almost. C++ is as close as possible to compatible with ANSI-C but no closer.
  450. In practice, the major difference is that C++ requires prototypes, and that
  451. `f()' declares a function that takes no parameters, while ANSI-C rules state
  452. that `f()' declares a function that takes any number of parameters of any type.
  453. There are some very subtle differences as well, like the sizeof a char literal
  454. being equal to the sizeof a char (in ANSI-C, sizeof('x') is the sizeof an int).
  455. Structure `tags' are in the same namespace as other names in C++, but C++ has
  456. some warts to take care of backward compatibility here.
  457.  
  458. ==============================================================================
  459.  
  460. Q7: How long does it take to learn C++?
  461. A: I and others teach standard industry `short courses' (for those not familiar
  462. with these, you pack a university semester course into one 40hr work-week), and
  463. have found them successful.  However mastery takes experience, and there's no
  464. substitute for time.  Laboratory time is essential for any OOP course, since it
  465. allows concepts to `gel'.
  466.  
  467. Generally people start out wondering why the company has devoted a full 5 days
  468. to something as trivial as another programming language.  Then about half way
  469. through, they realize they're not being taught just a new syntax, but an
  470. entirely different way of thinking and programming and designing and . . . .
  471. Then they begin to feel dumb, since they can't quite grasp what is being said.
  472. Then they get mad and wonder why the course isn't taught in two or three weeks
  473. instead.  Finally about Wednesday afternoon the lights go `clink', and their
  474. faces brighten, and they `get it'.  By Friday, they've had numerous laboratory
  475. `experiments' and they've seen both sides of reusable components (both how to
  476. code *from* reuse, and how to code *for* reuse).  It's different in every time
  477. I teach, but the `reuse' aspect is rewarding, since it has a large potential to
  478. improve software production's overall economics.
  479.  
  480. It takes 9 months to `master' C++/OOP.  Less if there is already a body of
  481. experts and code that programmers have regular access to, more if there isn't a
  482. `good' general purpose C++ class library available.
  483.  
  484. ==============================================================================
  485. SECTION 3: Basics of the paradigm
  486. ==============================================================================
  487.  
  488. Q8: What is a class?
  489. A: A class defines a data type, much like a struct would be in C.  In a CompSci
  490. sense, a type consists of two things: a set of values *and* a set of operations
  491. which operate on those values.  Thus `int' all by itself isn't a true `type'
  492. until you add operations like `add two ints' or `int*int', etc.  In exactly the
  493. same way, a `class' provides a set of (usually `public') operations, and a set
  494. of (usually non-public) data bits representing the abstract values that
  495. instances of the type can have.  From a C language perspective, a `class' is a
  496. `struct' whose members default to `private'.
  497.  
  498. ==============================================================================
  499.  
  500. Q9: What is an object?
  501. A: An object is a region of storage with associated semantics.  After the
  502. declaration `int i;', we say that `i is an object of type int'.  In C++/OOP,
  503. `object' is usually used to mean `an instance of a class'.  Thus a class
  504. defines the behavior of possibly many objects (instances).
  505.  
  506. ==============================================================================
  507.  
  508. Q10: What is a reference?
  509. A: A reference is an alias (an alternate name) for an object.  It is frequently
  510. used for pass-by-reference; ex:
  511.  
  512.     void swap(int& i, int& j)
  513.     {
  514.       int tmp = i;
  515.       i = j;
  516.       j = tmp;
  517.     }
  518.  
  519.     main()
  520.     {
  521.       int x, y;
  522.       //...
  523.       swap(x,y);
  524.     }
  525.  
  526. Here `i' and `j' are aliases for main's `x' and `y' respectively.  The effect
  527. is as if you used the C style pass-by-pointer, but the `&' is moved from the
  528. caller into the callee.  Pascal enthusiasts will recognize this as a VAR param.
  529.  
  530. ==============================================================================
  531.  
  532. Q11: What happens if you assign to a reference?
  533. A: Assigning to a reference changes the referred-to value, thus a ref is an
  534. `Lvalue' (something that can appear on the `L'eft-hand-side of an assignment
  535. statement) for the referred-to value.  This insight can be pushed a bit farther
  536. by allowing references to be *returned*, thus allowing function calls on the
  537. left hand side of an assignment stmt.
  538.  
  539. ==============================================================================
  540.  
  541. Q12: How can you reseat a reference to make it refer to a different object?
  542. A: Unlike a pointer, once a reference is bound to an object, it can NOT be
  543. `reseated' to another object.  The reference itself isn't an object; you can't
  544. separate the reference from the referred-to-object.  Ex: `&ref' is the address
  545. of the referred-to-object, not of the reference itself.
  546.  
  547. ==============================================================================
  548.  
  549. Q13: When should I use references, and when should I use pointers?
  550. A: Old line C programmers sometimes don't like references since the reference
  551. semantics they provide isn't *explicit* in the caller's code.  After a bit of
  552. C++ experience, however, one quickly realizes this `information hiding' is an
  553. asset rather than a liability.  In particular, reuse-centered OOP tends to
  554. migrate the level of abstraction away from the language of the machine toward
  555. the language of the problem.
  556.  
  557. References are usually preferred over ptrs whenever you don't need `reseating'
  558. (see early question on `How can you reseat a reference').  This usually means
  559. that references are most useful in a class' public interface.  References then
  560. typically appear on the skin of an object, and pointers on the inside.
  561.  
  562. The exception to the above is where a function's parameter or return value
  563. needs a `sentinel' reference.  This is usually best done by returning/taking a
  564. pointer, and giving the NULL pointer this special significance (references
  565. should always alias *objects*, not a dereferenced NULL ptr).
  566.  
  567. ==============================================================================
  568.  
  569. Q14: What are inline fns? What are their advantages? How are they declared?
  570. A: An inline function is a function which gets textually inserted by the
  571. compiler, much like a macro.  Like macros, performance is improved by avoiding
  572. the overhead of the call itself, and (especially!) by the compiler being able
  573. to optimize *through* the call (`procedural integration').  Unlike macros,
  574. arguments to inline fns are always evaluated exactly once, so the `call' is
  575. semantically like a regular function call only faster.  Also unlike macros,
  576. argument types are checked and necessary conversions are performed correctly.
  577.  
  578. Beware that overuse of inline functions can cause code bloat, which can in
  579. turn have a negative performance impact in paging environments.
  580.  
  581. They are declared by using the `inline' keyword when the function is defined:
  582.     inline void f(int i, char c) { /*...*/ }   //an inline function
  583. or by including the function definition itself within a class:
  584.     class X {
  585.     public:
  586.       void f(int i, char c) { /*...*/ }   //inline function within a class
  587.     };
  588. or by defining the member function as `inline' outside the class:
  589.     class X {
  590.     public:
  591.       void f(int i, char c);
  592.     };
  593.     //...
  594.     inline void X::f(int i, char c) {/*...*/} //inline fn outside the class
  595.  
  596. Generally speaking, a function cannot be defined as `inline' after it has been
  597. called.  Inline functions should be defined in a header file, with `outlined'
  598. functions appearing in a `.C' file (or .cpp, etc; see question on file naming
  599. conventions).
  600.  
  601. ==============================================================================
  602. SECTION 4: Constructors and destructors
  603. ==============================================================================
  604.  
  605. Q15: What is a constructor?  Why would I ever use one?
  606. A: Objects should establish and maintain their own internal coherence.  The
  607. `maintaining' part is done by ensuring self-consistency is restored after any
  608. operation completes (ex: by incrementing the link count after adding a new link
  609. to a linked list).  The part about `establishing coherence' is the job of a
  610. constructor.
  611.  
  612. Constructors are like `init functions'; they build a valid object.  The
  613. constructor turns a pile of incoherent arbitrary bits into a living object.
  614. Minimally it initializes any internally used fields that are needed, but it may
  615. also allocate resources (memory, files, semaphores, sockets, ...).
  616.  
  617. A constructor is like a `factory': it builds objects from dust.
  618.  
  619. `ctor' is a typical abbreviation for constructor.
  620.  
  621. ==============================================================================
  622.  
  623. Q16: How can I make a constructor call another constructor as a primitive?
  624. A: You can't.  Use an `init()' member function instead (often `private:').
  625.  
  626. ==============================================================================
  627.  
  628. Q17: What are destructors really for?  Why would I ever use them?
  629. A: Destructors are used to release any resources allocated by the object's
  630. constructor.  Ex: a Lock class might lock a semaphore, and the destructor will
  631. release that semaphore.  The usual `resource' being acquired in a constructor
  632. (and subsequently released in a destructor) is dynamically allocated memory.
  633.  
  634. `dtor' is a typical abbreviation for destructor
  635.  
  636. ==============================================================================
  637. SECTION 5: Operator overloading
  638. ==============================================================================
  639.  
  640. Q18: What is operator overloading?
  641. A: Operator overloading allows the basic C/C++ operators to have user-defined
  642. meanings on user-defined types (classes).  They are syntactic sugar for
  643. equivalent function calls; ex:
  644.  
  645.     class X {
  646.       //...
  647.     public:
  648.       //...
  649.     };
  650.  
  651.     X add(X, X);    //a top-level function that adds two X's
  652.     X mul(X, X);    //a top-level function that multiplies two X's
  653.  
  654.     X f(X a, X b, X c)
  655.     {
  656.       return add(add(mul(a,b), mul(b,c)), mul(c,a));
  657.     }
  658.  
  659. Now merely replace `add' with `operator+' and `mul' with `operator*':
  660.  
  661.     X operator+(X, X);    //a top-level function that adds two X's
  662.     X operator*(X, X);    //a top-level function that multiplies two X's
  663.  
  664.     X f(X a, X b, X c)
  665.     {
  666.       return a*b + b*c + c*a;
  667.     }
  668.  
  669. ==============================================================================
  670.  
  671. Q19: What operators can/cannot be overloaded?
  672. A: Most can be overloaded. The only C operators that can't be are `.' and `?:'
  673. (and `sizeof', which is technically an operator).  C++ adds a few of its own
  674. operators, most of which can be overloaded except `::' and `.*'.
  675.  
  676. Here's an example of the subscript operator (it returns a reference).
  677. First withOUT operator overloading:
  678.     class Vec {
  679.       int data[100];
  680.     public:
  681.       int& elem(unsigned i) { if (i>99) error(); return data[i]; }
  682.     };
  683.  
  684.     main()
  685.     {
  686.       Vec v;
  687.       v.elem(10) = 42;
  688.       v.elem(12) += v.elem(13);
  689.     }
  690.  
  691. Now simply replace `elem' with `operator[]':
  692.     class Vec {
  693.       int data[100];
  694.     public:
  695.       int& operator[](unsigned i) { if (i>99) error(); return data[i]; }
  696.     };   //^^^^^^^^^^--formerly `elem'
  697.  
  698.     main()
  699.     {
  700.       Vec v;
  701.       v[10] = 42;
  702.       v[12] += v[13];
  703.     }
  704.  
  705. ==============================================================================
  706.  
  707. Q20: Can I create a `**' operator for `to-the-power-of' operations?
  708. A: No.
  709.  
  710. The names of, precedence of, associativity of, and arity of operators is fixed
  711. by the language.  There is no `**' operator in C++, so you cannot create one
  712. for a class type.
  713.  
  714. If you doubt the wisdom of this approach, consider the following code:
  715.     x = y ** z;
  716. Looks like your power operator?  Nope.  z may be a ptr, so this is actually:
  717.     x = y * (*z);
  718. Lexical analysis groups characters into tokens at the lowest level of the
  719. compiler's operations, so adding new operators would present an implementation
  720. nightmare (not to mention the increased maintenance cost to read the code!).
  721.  
  722. Besides, operator overloading is just syntactic sugar for function calls.  It
  723. does not add fundamental power to the language (although this particular
  724. syntactic sugar can be very sweet, it is not fundamentally necessary).  I
  725. suggest you overload `pow(base,exponent)', for which a double precision version
  726. is provided by the ANSI-C <math.h> library.
  727.  
  728. By the way: operator^ looks like a good candidate for to-the-power-of, but it
  729. has neither the proper precedence nor associativity.
  730.  
  731. ==============================================================================
  732. SECTION 6: Friends
  733. ==============================================================================
  734.  
  735. Q21: What is a `friend'?
  736. A: Friends can be either functions or other classes.  The class grants friends
  737. access privileges.  Normally a developer has political and technical control
  738. over both the class, its members, and its friends (that way you avoid political
  739. problems when you want to update a portion, since you don't have to get
  740. permission from the present owner of the other piece(s)).
  741.  
  742. ==============================================================================
  743.  
  744. Q22: Do `friends' violate encapsulation?
  745. A: Friends can be looked at three ways: (1) they are not class members and they
  746. therefore violate encapsulation of the class members by their mere existence,
  747. (2) a class' friends are absorbed into that class' encapsulation barrier, and
  748. (3) any time anyone wants to do anything tricky they textedit the header file
  749. and add a new friend so they can get right in there and fiddle 'dem bits.
  750.  
  751. No one argues that (3) is a Good Thing, and for good reasons. The arguments for
  752. (1) always boil down to the rather arbitrary and somewhat naive view that a
  753. class' member functions `should' be the *only* functions inside a class'
  754. encapsulation barrier.  I have not seen this view bear fruit by enhancing
  755. software quality.  On the other hand, I have seen (2) bear fruit by lowering
  756. the *overall* coupling in a software system.  Reason: friends can be used as
  757. `liaisons' to provide safe, screened access for the whole world, perhaps in a
  758. way that the class syntactically or semantically isn't able to do for itself.
  759.  
  760. Conclusion: friend functions are merely a syntactic variant of a class' public
  761. access functions.  When used in this manner, they don't violate encapsulation
  762. any more than a member function violates encapsulation.  Thus a class' friends
  763. and members *are* the encapsulation barrier, as defined by the class itself.
  764.  
  765. I've actually seen the `friends always violate encapsulation' view *destroy*
  766. encapsulation: programmers who have been taught that friends are inherently
  767. evil want to avoid them, but they have another class or fn that needs access to
  768. some internal detail in the class, so they provide a member fn which exposes
  769. the class' internal details to the PUBLIC!  Private decisions should stay
  770. private, and only those inside your encapsulation barrier (your members,
  771. friends, and [for `protected' things] your subclasses) should have access.
  772.  
  773. ==============================================================================
  774.  
  775. Q23: What are some advantages/disadvantages of using friends?
  776. A: The advantage of using friends is generally syntactic.  Ie: both a member fn
  777. and a friend are equally privileged (100% vested), but a friend function can be
  778. called like f(obj), where a member is called like obj.f().  When it's not for
  779. syntactic reasons (which is not a `bad' reason -- making an abstraction's
  780. syntax more readable lowers maintenance costs!), friends are used when two or
  781. more classes are designed to be more tightly coupled than you want for `joe
  782. public' (ex: you want to allow class `ListIter' to have more privilege with
  783. class `List' than you want to give to `main()').
  784.  
  785. Friends have three disadvantages.  The first disadvantage is that they add to
  786. the global namespace.  In contrast, the namespace of member functions is buried
  787. within the class, reducing the chance for namespace collisions for functions.
  788.  
  789. The second disadvantage is that they aren't inherited.  That is, the
  790. `friendship privilege' isn't inherited.  This is actually an advantage when it
  791. comes to encapsulation.  Ex: I may declare you as my friend, but that doesn't
  792. mean I trust your kids.
  793.  
  794. The third disadvantage is that they don't bind dynamically.  Ie: they don't
  795. respond to polymorphism.  There are no virtual friends; if you need one, have a
  796. friend call a hidden (usually `protected:') virtual member fn.  Friends that
  797. take a ptr/ref to a class can also take a ptr/ref to a publically derived class
  798. object, so they act as if they are inherited, but the friendship *rights* are
  799. not inherited (the friend of a base has no special access to a class derived
  800. from that base).
  801.  
  802. ==============================================================================
  803.  
  804. Q24: What does it mean that `friendship is neither inherited nor transitive'?
  805. A: This is speaking of the access privileges granted when a class declares a
  806. friend.
  807.  
  808. The access privilege of friendship is not inherited:
  809.  * I may trust you, but I don't necessarily trust your kids.
  810.  * My friends aren't necessarily friends of my kids.
  811.  * Class `Base' declares f() to be a friend, but f() has no special access
  812.    rights with class `Derived'.
  813.  
  814. The access privilege of friendship is not transitive:
  815.  * I may trust you, and you may trust Sam, but that doesn't necessarily mean
  816.    that I trust Sam.
  817.  * A friend of a friend is not necessarily a friend.
  818.  
  819. ==============================================================================
  820.  
  821. Q25: When would I use a member function as opposed to a friend function?
  822. A: Use a member when you can, and a friend when you have to.
  823.  
  824. Like in real life, my family members have certain privileges that my friends do
  825. not have (ex: my family members inherit from me, but my friends do not, etc).
  826. To grant privileged access to a function, you need either a friend or a member;
  827. there is no additional loss of encapsulation one way or the other.  Sometimes
  828. friends are syntactically better (ex: in class `X', friend fns allow the `X'
  829. param to be second, while members require it to be first).  Another good use of
  830. friend functions are the binary infix arithmetic operators.  Ex: `aComplex +
  831. aComplex' probably should be defined as a friend rather than a member, since
  832. you want to allow `aFloat + aComplex' as well (members don't allow promotion of
  833. the left hand arg, since that would change the class of the object that is the
  834. recipient of the member function invocation).
  835.  
  836. ==============================================================================
  837. SECTION 7: Input/output via <iostream.h> and <stdio.h>
  838. ==============================================================================
  839.  
  840. Q26: How can I provide printing for a `class X'?
  841. A: Provide a friend operator<<:
  842.  
  843.     class X {
  844.     public:
  845.       friend ostream& operator<< (ostream& o, const X& x)
  846.         { return o << x.i; }
  847.       //...
  848.     private:
  849.       int i;    //just for illustration
  850.     };
  851.  
  852. We use a friend rather than a member since the `X' parameter is 2nd, not 1st.
  853. Input is similar, but the signature is:
  854.     istream& operator>> (istream& i, X& x);  //not `const X& x' !!
  855.  
  856. ==============================================================================
  857.  
  858. Q27: Why should I use <iostream.h> instead of the traditional <stdio.h>?
  859. A: See next question.
  860.  
  861. ==============================================================================
  862.  
  863. Q28: Printf/scanf weren't broken; why `fix' them with ugly shift operators?
  864. A: The overloaded shift operator syntax is strange at first sight, but it
  865. quickly grows on you.  However syntax is just syntax; the real issues are
  866. deeper.  Printf is arguably not broken, and scanf is perhaps livable despite
  867. being error prone, however both are limited with respect to what C++ I/O can
  868. do.  C++ I/O (left/right shift) is, relative to C (printf/scanf):
  869.  * type safe -- type of object being I/O'd is known statically by the compiler
  870.     rather than via dynamically tested '%' fields
  871.  * less error prone -- redundant info has greater chance to get things wrong
  872.     C++ I/O has no redundant '%' tokens to get right
  873.  * faster -- printf is basically an `interpreter' of a tiny language whose
  874.     constructs mainly include '%' fields.  the proper low-level routine is
  875.     chosen at runtime based on these fields.  C++ I/O picks these routines
  876.     statically based on actual types of the args
  877.  * extensible -- perhaps most important of all, the C++ I/O mechanism is
  878.     extensible to new user-defined data types (imagine the chaos if
  879.     everyone was simultaneously adding new incompatible '%' fields to
  880.     printf and scanf?!).  Remember: we want to make user-defined types
  881.     (classes) look and act like `built-in' types.
  882.  * subclassable -- ostream and istream (the C++ replacements for FILE*) are
  883.     real classes, and hence subclassable.  This means you can have other
  884.     user defined things that look and act like streams, yet that do
  885.     whatever strange and wonderful things you want.  You automatically
  886.     get to use the zillions of lines of I/O code written by users you
  887.     don't even know, and they don't need to know about your `extended
  888.     stream' class.  Ex: you can have a `stream' that writes to a memory
  889.     area (incore formatting provided by the standard class `strstream'),
  890.     or you could have it use the stdio buffers, or [you name it...].
  891.  
  892. --
  893. Marshall Cline
  894. --
  895. Marshall P. Cline, Ph.D. / Paradigm Shift Inc / PO Box 5108 / Potsdam NY 13676
  896. cline@parashift.com / 315-353-6100 / FAX: 315-353-6110
  897.